了解分支的用途後,在合作開發上一定便利許多,但同樣地,不是每件事情都順順利利,只要有合作的事情,總是會有衝突、摩擦的狀況發生。在 Git 分支裡,常碰到「合併衝突」的情形發生,什麼是合併衝突,又怎麼樣才能解決呢?以下會慢慢講解。
👉 合併衝突 - 錯誤訊息提示
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
常見的合併衝突狀況|
👉 合併內容同時修改同一行 code 時,就會有衝突情況。
假設今天有兩位服裝設計師為你打造符合你的特質的打扮,兩人共同協作,但在過程中,對於其中一件配件兩人彼此看法不同,例如帽子,但是你只有一個頭,如果雙方提供的帽子都搭上去的話,這樣就會裝載不下,也失去了初衷,這時候我們可以決定其中一個來做最後的選擇。
同理,在一個專案中,如果有多人合作,萬一改到相同的樣式設定,或者改到同一行 html 結構,那麼在合併分支時,Git 就會很貼心的提醒你,現在有地方發生衝突,只要我們查看後決定要留下哪一個 code ,之後再繼續提交就解決囉!
衝突範例|
先建立一個檔案,針對此檔案建立兩個分支(master、a_branch)
$ mkdir demo # 建立一個 demo 資料夾
$ cd demo # 進入 demo 資料夾
$ git init # 建立數據庫
$ touch index.html # 新增一個 index.html 檔案
$ git add . # 加至暫存區
$ git commit -m"update index.html" # 提交至儲存庫
提交完成後,我們另外建立一個分支:git branch a_branch
建立完兩個分支後,分別在兩個分支的狀態對這個 index.html 檔案做修改並提交版本。
首先是 master 分支:
// 檔案修改完後,加至暫存區並提交
$ git add . # 加至暫存區
$ git commit -m"訊息記錄" # 提交至儲存庫
再來切換到 a_branch
分支,修改 index.html 檔案。
一樣要記得加至暫存區並提交
現在試著將 master
分支與 a_branch
分支合併:
$ git merge a_branch # 在 master 分支上合併 a_branch 分支
錯誤訊息!合併發生衝突了!
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
Auto-merging index.html
- git 正在自動合併 index.html 檔案。
CONFLICT (content): Merge conflict in index.html
- 合併衝突的種類屬於內容衝突 CONFLICT (content)
Automatic merge failed; fix conflicts and then commit the result.
- 自動合併錯誤,請修復衝突的地方,再來進行 commit 動作。
解決流程|
git status
指令查看狀態git add
指令將修改後的檔案加回暫存區git commit
指令繼續提交新的版本到儲存庫🛠 實際操作範例|
首先發現有衝突提示:
使用 git status
指令查看狀態
$ git status # 查看狀態
both modified: index.html
打開有錯誤的檔案,可以看到 Git 有貼心的幫你指出哪邊發生衝突
將衝突的地方修改,選擇留下最終要的那個 Code
最後才重新加至暫存區,並提交,最後就完成這次合併的動作囉!
$ git add . # 加至暫存區
$ git commit -m"訊息記錄" # 提交至儲存庫
只要是檔案之間有溝通不良情形,就會打架,即使是使用 Rebase 指令合併,也會有合併衝突的情形發生。但是使用 Rebase 指令合併發生衝突時,它的過程跟一般合併不一樣的地方在於:執行過程卡住。
這部分可以使用 SourceTree 有分支圖示會更好理解喔!
解決方式|
跟上面提過的解決方式一樣,當我們發現錯誤訊息時,首先使用檢查狀態指令,查看哪個地方出問題,後續再修改,修改完畢後再繼續執行指令,就可以完成提交囉!
👉 流程大概:
發現錯誤訊息
→ git status
找到問題點
→ 修改
→ git add
加回暫存區
→ git rebase --continue
$ git checkout --ours [檔名] // 如果決定使用當前分支的檔案
$ git checkout --theirs [檔名] // 如果決定使用對方的檔案
先前提到的檔案合併大多都是文字檔案,Git 就可以使用標記的方式告訴我們哪裡出錯,但有時候會遇到例如圖片檔之類的二進位檔,這時候就會難以使用肉眼的方式發現衝突的地方。
解決方式|
查看錯誤訊息提示
決定要使用哪個分支的檔案作為最後的選擇
根據當前的分支,來決定使用的參數 --ours
/ --theirs
git add
指令加回暫存區
git commit
指令提交至儲存庫